from flask import Flask                # 导入 Flask 框架（餐厅的主体结构）
from flask_cors import CORS            # 导入跨域插件（允许外卖员从外面进餐厅取餐）
from flask_jwt_extended import JWTManager # 导入 JWT 管理器（负责发放入场券和验票的保安队长）
from models import db                  # 从 models.py 导入我们要用的数据库工具
from routes import auth_bp             # 从 routes.py 导入我们写好的“认证蓝图”
import os                              # 导入操作系统工具（用来帮我们找文件路径）

def create_app():
    # 2. 创建 Flask 应用实例
    # __name__ 告诉 Flask 当前程序运行在哪里，方便它找到资源文件
    app = Flask(__name__)

    # 3. 配置数据库（仓库）的位置
    base_dir = os.path.abspath(os.path.dirname(__file__))
    
    # 告诉 Flask：我们的数据库是 SQLite，文件名叫 app.db，就放在项目目录下
    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(base_dir, 'app.db')
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
    
    # 4. 配置 JWT 密钥（防伪印章）
    # 服务器在生成 Token（入场券）时，会用这个字符串加密。
    # 只有拥有这个密钥的服务器，才能验证 Token 是不是伪造的。
    app.config['JWT_SECRET_KEY'] = 'super-secret-key-for-school-demo'

    # 5. 初始化插件（把工具安装到 App 上）
    db.init_app(app)       # 数据库工具连接 App
    JWTManager(app)        # 保安队长入驻 App
    CORS(app)              # 开启跨域允许（让前端网页能访问后端接口）

    # 6. 注册蓝图（挂牌营业）
    # 告诉 App：如果在 routes.py 里定义了功能，都算数。
    # url_prefix='/api' 意思是：所有这个蓝图里的接口，前面都要加上 /api
    app.register_blueprint(auth_bp, url_prefix='/api')

    # 7. 创建数据库表
    # with app.app_context(): 这句话意思是“在 App 的环境下执行”
    # db.create_all()：去看看数据库里有没有表，没有的话，按照代码里的定义自动建表
    with app.app_context():
        db.create_all()

    return app

if __name__ == '__main__':
    app = create_app()                  
    print("项目启动: http://127.0.0.1:5000") 
    app.run(debug=True)                 